Registrace souboru ocx do systemu - druhy pokus
Otázka od: Ing. Dubsky Jan
26. 10. 2004 9:28
Budto muj dotaz zapadl, nebo to nikdo nevi. Nicmene zkusim se zeptat znovu.
V D6 vytvarim projekt, ktery vyuziva prvek ActivX - komponentu pro
zobrazovani inventorovskych vykresu - soubor InventorViewCtrl.ocx.
Na svem pocitaci mam knihovnu zaregistrovanou pomoci Delphi, takze program
funguje OK. Ale pokud spustim exe soubor na stroji, kde knihovna neni
registrovana, tak to spadne. Jak se registruje tato knihovna, ktera je
fyzicky ulozena na serveru v adresari meho programu na okolni pocitace.
Videl bych to asi tak, ze si pri spusteni muj program zjisti, jestli je
knihovna registrovana, pokud ano, je to OK, pokud ne - tj. pri prvnim
spusteni, tak ji zaregistruje. Nebo nejaka externi utilitka, kterou spustim
rucne pri nastavovani - instalaci meho SW.
Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu -
Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul nebyl
nalezen.
Zkousel jsem studovat i unitu v prikladech (..\Demos\ActiveX\TRegSvr), ale
je to na me prilis vysoka matematika. Zkuste me trochu nakopnout, nebo
poslat cast prislusneho kodu, kterym si prvek ActivX zaregistruji na
libovolnem stroji.
Dik
Honza
Odpovedá: Ondrej Kelle
26. 10. 2004 10:05
> Videl bych to asi tak, ze si pri spusteni muj program zjisti,
> jestli je knihovna registrovana, pokud ano, je to OK, pokud
> ne - tj. pri prvnim spusteni, tak ji zaregistruje. Nebo
> nejaka externi utilitka, kterou spustim rucne pri
> nastavovani - instalaci meho SW.
>
> Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu -
> Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul nebyl
> nalezen.
Ten subor musi na tom pocitaci byt, na mieste, kde ho system najde
(nastavenie PATH). Typicky su .ocx subory instalovane do windows system
directory (\WINNT\System32).
Ak ta .ocx kniznica vyzaduje nejake dalsie subory, musis ich tam skopirovat
tiez.
Potom by nemal byt problem zaregistrovat ju pomocou nastroja regsvr32.
> Zkousel jsem studovat i unitu v prikladech
> (..\Demos\ActiveX\TRegSvr), ale
> je to na me prilis vysoka matematika. Zkuste me trochu nakopnout, nebo
> poslat cast prislusneho kodu, kterym si prvek ActivX zaregistruji na
> libovolnem stroji.
Mozno je to demo nejasne, pretoze pouziva parametre z command line. Je to
velmi jednoduche, staci zavolat exportovanu funkciu s nazvom
'DllRegisterServer'. Procedura na registraciu by mohla vyzerat aj takto:
procedure RegisterAxLib(const FileName: string);
const
SRegProcName = 'DllRegisterServer';
var
LibHandle: THandle;
RegProc: TRegProc;
begin
LibHandle := LoadLibrary(PChar(FileName));
if LibHandle = 0 then
raise Exception.CreateFmt(SLoadFail, [FileName]);
try
@RegProc := GetProcAddress(LibHandle, SRegProcName);
if @RegProc = nil then
raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
if RegProc <> 0 then
raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
finally
FreeLibrary(LibHandle);
end;
end;
Ak potrebujes programovo zistit, ci je dana .ocx uz zaregistrovana, budes
asi musiet hladat, ci su v registry GUID, ktore ta .ocx pouziva.
HTH
TOndrej
Odpovedá: Ing. Pavel Spisar
26. 10. 2004 11:32
Ahoj ja pouzivam pro jine OCX nasledujici funkci
vysvetleni
1-registrace pomoci TREGSVR.EXE - najdes v DELPHI
2-registrace pomoci regsvr32.exe - ve WINDOWS
3-rucni zapsani hodnot do registru (najdi u sebe v registru, uloz a modifikuj
do PAS)[v prikladu zkraceno]
Pozor, pozor k OCX byva vzdy jeste nejake to DLL, .....
// -----------------------------------------------------------------------------
function Registruj(typ:integer;umisteni:string):boolean;
var
ws,prog_reg:string;
Reg:TRegistry;
begin
Registruj:=false;
case typ of
1,2:begin
case typ of
1:begin
prog_reg:='TREGSVR.EXE';
ws:=umisteni;//umisteni aplikace
end;
2:begin
prog_reg:='regsvr32.exe';
SetLength(ws,256);
GetSystemDirectory(PChar(ws),256);//zjisteni systemoveho adresare
WINDOWS
ws:=StrPas(PChar(ws));
end;
end;
ws:=ws+'\'+prog_reg;
if FileExists(ws)=false then exit;
Winexec(PChar(ws+' '+umisteni+'\GRAPH32.OCX'),SW_MINIMIZE);
end;
3:begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('SOFTWARE\Classes\CLSID\{0842D100-1E19-101B-9AAF-1A1626551E7C}',True);
Reg.WriteString('','Pinnacle-BPS Graph Control');
Reg.CloseKey;
//atd atd atd
Reg.Destroy;
end;
end;
Registruj:=True;
end;
// -----------------------------------------------------------------------------
Ondrej Kelle wrote:
>> Videl bych to asi tak, ze si pri spusteni muj program zjisti,
>> jestli je knihovna registrovana, pokud ano, je to OK, pokud
>> ne - tj. pri prvnim spusteni, tak ji zaregistruje. Nebo
>> nejaka externi utilitka, kterou spustim rucne pri
>> nastavovani - instalaci meho SW.
>>
>> Jiz jsem zkousel pouzit program regsvr32 z windowsu - nahlasil chybu
>> - Provedeni funkce LoadLybray(......) se nezdarilo - uvedeny modul
>> nebyl nalezen.
>
> Ten subor musi na tom pocitaci byt, na mieste, kde ho system najde
> (nastavenie PATH). Typicky su .ocx subory instalovane do windows
> system directory (\WINNT\System32).
> Ak ta .ocx kniznica vyzaduje nejake dalsie subory, musis ich tam
> skopirovat tiez.
> Potom by nemal byt problem zaregistrovat ju pomocou nastroja regsvr32.
>
>> Zkousel jsem studovat i unitu v prikladech
>> (..\Demos\ActiveX\TRegSvr), ale
>> je to na me prilis vysoka matematika. Zkuste me trochu nakopnout,
>> nebo poslat cast prislusneho kodu, kterym si prvek ActivX
>> zaregistruji na libovolnem stroji.
>
> Mozno je to demo nejasne, pretoze pouziva parametre z command line.
> Je to velmi jednoduche, staci zavolat exportovanu funkciu s nazvom
> 'DllRegisterServer'. Procedura na registraciu by mohla vyzerat aj
> takto:
>
> procedure RegisterAxLib(const FileName: string);
> const
> SRegProcName = 'DllRegisterServer';
> var
> LibHandle: THandle;
> RegProc: TRegProc;
> begin
> LibHandle := LoadLibrary(PChar(FileName));
> if LibHandle = 0 then
> raise Exception.CreateFmt(SLoadFail, [FileName]);
> try
> @RegProc := GetProcAddress(LibHandle, SRegProcName);
> if @RegProc = nil then
> raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> if RegProc <> 0 then
> raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> finally
> FreeLibrary(LibHandle);
> end;
> end;
>
> Ak potrebujes programovo zistit, ci je dana .ocx uz zaregistrovana,
> budes asi musiet hladat, ci su v registry GUID, ktore ta .ocx pouziva.
>
> HTH
> TOndrej
Odpovedá: Ing. Dubsky Jan
27. 10. 2004 6:33
Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
hlasi undeclared identifier.
Diky
Honza
> procedure RegisterAxLib(const FileName: string);
> const
> SRegProcName = 'DllRegisterServer';
> var
> LibHandle: THandle;
> RegProc: TRegProc;
> begin
> LibHandle := LoadLibrary(PChar(FileName));
> if LibHandle = 0 then
> raise Exception.CreateFmt(SLoadFail, [FileName]);
> try
> @RegProc := GetProcAddress(LibHandle, SRegProcName);
> if @RegProc = nil then
> raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> if RegProc <> 0 then
> raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> finally
> FreeLibrary(LibHandle);
> end;
> end;
Odpovedá: Milan Tomes
27. 10. 2004 7:07
type
TRegProc = function: HRESULT; stdcall;
resourcestring
SLoadFail = 'Nepovedlo se nahrat knihovnu %s';
SCantFindProc = 'V knihovne nebyla nalezena funkce %s';
SRegFail = 'Registrace se nezdarila (funkce %s v knihovne %s)';
> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Ing. Dubsky Jan
> Sent: Wednesday, October 27, 2004 7:34 AM
>
> Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
> aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
> hlasi undeclared identifier.
>
> Diky
>
> Honza
>
>
> > procedure RegisterAxLib(const FileName: string);
> > const
> > SRegProcName = 'DllRegisterServer';
> > var
> > LibHandle: THandle;
> > RegProc: TRegProc;
> > begin
> > LibHandle := LoadLibrary(PChar(FileName));
> > if LibHandle = 0 then
> > raise Exception.CreateFmt(SLoadFail, [FileName]);
> > try
> > @RegProc := GetProcAddress(LibHandle, SRegProcName);
> > if @RegProc = nil then
> > raise Exception.CreateFmt(SCantFindProc, [SRegProcName]);
> > if RegProc <> 0 then
> > raise Exception.CreateFmt(SRegFail, [SRegProcName, FileName]);
> > finally
> > FreeLibrary(LibHandle);
> > end;
> > end;
>
>
>
>
Odpovedá: tondrej@t-online.de
27. 10. 2004 7:01
> Tomu bych rozumel, ale jeste potrebuji poradit, co mam dat do uses,
> aby program znal TRegProc, SLoadFail, SRegFail atd. Na vsechny tyto veci
> hlasi undeclared identifier.
Najdes ich v $(DELPHI)\Demos\ActiveX\TRegSvr. Mozes si ich odtial
skopirovat do svojho projektu.
HTH
TOndrej